MacOS平台一个古老的恶意软件INIT29的分析
在上一篇文章(https://knight.sc/software/2020/04/19/classic-macos-development.html)中,我介绍了我设置的“经典” Mac OS仿真器。
我设置模拟器的目的之一是能够查看和分析感染旧版Mac OS的病毒。
我认为研究旧病毒很有趣的原因有二。首先,它很好地概述了68k汇编。其次,这提供了一个研究恶意软件历史的有趣角度。我决定研究的第一个病毒称为INIT 29。
下面是Disinfectant 3.7.1的帮助文件对此病毒的简短描述:
INIT 29病毒于1988年底首次出现。我们对其起源了解不多。第二个较小的变异出现在1994年3月。两种类型之间没有显着差异。原始型称为“ INIT 29 A”。该变型称为“ INIT 29 B”。
INIT 29具有极强的感染性。它迅速传播。与Scores和nVIR不同,系统不必运行应用程序即可被感染,而且INIT 29可以感染几乎所有文件,包括应用程序,系统文件和文档文件。文档文件可以被感染,但没有传染性。该病毒只能通过系统文件和应用程序文件传播。
使用ResEdit可以轻松识别感染了INIT 29病毒的应用程序。如下图:
病毒的第一个指示是恰好712个字节的CODE资源。第二个指示可以在跳转表中看到。
每个可执行文件都有一个包含跳转表的ID为0的CODE资源。如果是小型应用程序,则表中可能只有一两个条目。
通常,当编译器构建应用程序时,它将顺序创建CODE资源,并且类似地,跳转表也将以线性方式进行布局。跳转表中的第一个条目指向可执行文件的主要入口点。
然而对于上面的跳转表,跳转表中的第一个条目实际上指向ID为3的CODE资源。基于资源名称,你可以看到ID 1的名称为“ Main”,且包含最多的代码,这应该是应用程序的入口点,但是INIT 29病毒已修改了跳转表入口以指向自身。
下图显示了一部分病毒代码。您可以看到它如何将原始跳转表条目保存到ID为1的CODE资源中。
运行受感染的应用程序时,它将调用UseResFile并传递refNum值为零。这将检索系统资源文件。
然后,它将在INIT资源部分中创建一个ID为29的新条目。这也是病毒名称的来源。病毒会将其所有712字节自身复制到此INIT资源中。然后,当系统下次启动时,将执行此代码。
使用ResEdit也很容易识别受感染的系统文件。我们可以在模拟器中运行受感染的应用程序,然后在病毒启动前后使用ResEdit比较系统文件。
左侧是病毒启动前的应用程序,右侧是病毒启动后。
你可以看到,在运行了受感染的应用程序之后,现在有了ID为29,大小为712字节的新 INIT资源。如果我们反汇编病毒代码,则可以看到以下内容:
INIT代码很短,它调用传入$A997的GetTrapAddress来获取当前OpenResFile函数的地址。
它将检查是否已打补丁,如果尚未打补丁,则会保存指向原始函数的指针。然后,它在系统堆上分配712个字节,并在那里复制其自身。
最后,它调用SetTrapAddress将其自身安装为新的OpenResFile函数。
OpenResFile是重要的系统API, Finder每次打开文件或运行可执行文件时,都要调用OpenResFile查找有关该文件的信息。
由于使用频率很高,所以病毒利用它也非常容易感染其他文件。
劫持的OpenResFile版本首先调用该函数的原始操作系统版本。这将加载资源文件并将其设置为当前资源。
然后,病毒会查看该文件是否有任何CODE资源。如果该文件没有任何CODE资源,则该病毒会创建ID为29的INIT资源,并将其712字节复制到其中。
这样会导致文档文件包含病毒代码,但无法感染其他任何文件。如果打开的资源确实具有CODE资源,则病毒会尝试查找要使用的空闲ID。它将使用最低的空闲ID来创建新的资源条目,并将其712字节复制到其中。
之后,它将打开ID为0的CODE资源,并修补跳转表以指向刚创建的新资源。这导致应用程序在下次尝试感染系统文件时开始运行病毒代码。
通过INIT 29病毒尝试感染打开的每个资源文件,可以很容易地看出为什么Disinfectant帮助文件称该病毒为“极具传染性”。
在大多数情况下,该病毒是无害的,只会感染文件。但是,由于它确实劫持了应用程序的启动,因此有可能在启动程序时注意到速度变慢。特
别有趣的是,这个病毒仅用712字节的代码就能完成这么多的工作。
看雪ID:一壶葱茜
https://bbs.pediy.com/user-665727.htm
▼
推荐文章++++
* 网鼎杯-武为止戈
好书推荐